package com.hc.programming.string;

/**
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
 * * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 * <p>
 * 示例 1：
 * 输入：s = "abcdefg", k = 2
 * 输出："bacdfeg"
 * 示例 2：
 * 输入：s = "abcd", k = 2
 * 输出："bacd"
 * <p>
 * 提示：
 * 1 <= s.length <= 10^4
 * s 仅由小写英文组成
 * 1 <= k <= 10^4
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/10/27 23:23
 */
public class 反转字符串II {
    public static void main(String[] args) {
        System.out.println(reverseStr("abcdefg", 2) + "-----=bacdfeg");
        System.out.println(reverseStr("abcd", 2) + "-----=bacd");
    }

    public static String reverseStr(String s, int k) {
//        return stringBuilder(s, k);
        return arr(s, k);
    }

    private static String arr(String s, int k) {
        if (s == null || s.isEmpty() || k <= 0) return s;
        char[] arr = s.toCharArray();
        int len = arr.length;
        for (int i = 0; i < len; i += 2 * k) {
            if (i + k > len) {
                reverse(arr, i, len - 1);
            } else {
                reverse(arr, i, i + k - 1);
            }
        }
        return new String(arr);
    }

    private static void reverse(char[] arr, int l, int r) {
        while (l < r) {
            char temp = arr[l];
            arr[l++] = arr[r];
            arr[r--] = temp;
        }
    }

    private static String stringBuilder(String s, int k) {
        if (s == null || s.isEmpty() || k <= 0) return s;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i += 2 * k) {
            int end = Math.min(i + 2 * k, s.length());
            if (end - i < k) {
                appendReverse(sb, s, i, end);
            } else {
                appendReverse(sb, s, i, i + k);
                sb.append(s, i + k, end);
            }
        }
        return sb.toString();
    }

    private static void appendReverse(StringBuilder sb, String s, int i, int end) {
        for (int j = end - 1; j >= i; j--) {
            sb.append(s.charAt(j));
        }
    }
}
